"""
以下是一个通过librosa库来提取音频特征信息的代码并且可视化
"""
import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np

# 加载wav音频文件
filename = '2.wav'  # 替换为你的音频文件的实际路径
y, sr = librosa.load(filename, sr=None)  # 默认自动检测采样率

# 提取音频时长
duration = librosa.get_duration(y=y, sr=sr)

# 提取Mel频谱图特征并转换为dB尺度
spec = librosa.feature.melspectrogram(y=y, sr=sr)
log_spec = librosa.power_to_db(spec, ref=np.max)

# 提取MFCC特征
mfcc = librosa.feature.mfcc(y=y, sr=sr)

# 提取Chroma STFT特征
chroma_stft = librosa.feature.chroma_stft(y=y, sr=sr)

# 提取节奏特征（如Tempo和Beat）
tempo, beat_frames = librosa.beat.beat_track(y=y, sr=sr)

# 可视化Mel频谱图
plt.figure(figsize=(10, 4))
librosa.display.specshow(log_spec, x_axis='time', y_axis='mel', sr=sr, fmax=8000)
plt.colorbar(format='%+2.0f dB')
plt.title('Mel')

# 可视化MFCC特征
plt.figure(figsize=(10, 4))
librosa.display.specshow(mfcc, x_axis='time')
plt.colorbar()
plt.title('MFCC')

# 可视化Chroma STFT特征
plt.figure(figsize=(10, 4))
librosa.display.specshow(chroma_stft, x_axis='time')
plt.colorbar()
plt.title('STFT')

# 显示图形
plt.show()

# 打印音频时长和检测到的Tempo
print(f"Audio duration: {duration:.2f} seconds")
print(f"Detected tempo: {tempo:.2f} BPM")

# 注意：此处仅简单展示了几种特征的提取与可视化，对于beat_frames等节奏特征的可视化可能需要进一步处理。
